home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / XINE-1.ZIP / XINE-1.016 < prev    next >
Text File  |  1996-10-25  |  11KB  |  297 lines

  1.  
  2.                                         /-----------------------------\
  3.                                         | Xine - issue #1 - Phile 016 |
  4.                                         \-----------------------------/
  5.  
  6.  
  7. A little introduction to cryptography by b0z0
  8. ---------------------------------------------
  9.  This is only a little introduction to the simplest method of encryption.
  10. All the methods described above may not be used to protect your important
  11. data. This text is only intended to give to the novice a general overview
  12. of the classic encryption methods, which are also the base of the current
  13. encryption algorithms. This methods are very simple, but i haven't already
  14. seen an article talking about them, so i decided to collect a little
  15. of material and write something about this :)
  16.  
  17. Substitution cipher
  18. -------------------
  19.  The substitution cipher basically works in this way:
  20. First of all let's fix a permutation of our alphabet
  21.  
  22.   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  23.   P E Y D X U W B Z T J M Q I R N V O L K G S H A C F
  24.  
  25. The rule of the substitution cipher is very simple: we must just change
  26. every character of the plain text with the correspondant permutation
  27. described by the second line of our example. All "A"s will became "P"s,
  28. all "B"s will became "E"s, "C"s will became "Y"s and so on.
  29.  So if the phrase that we would to encrypt was for example (spaces are
  30. ignored!)
  31.  
  32.      BILL GATES SUCKS
  33.  
  34.  the encrypted message would be
  35.  
  36.      EZMM WPKXL LGYJL
  37.  
  38.  The decryption of this message is very simple. We must just use the
  39. inverse permutation, which is obtained overturning the direct permutation:
  40.      
  41.   P E Y D X U W B Z T J M Q I R N V O L K G S H A C F
  42.   A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  43.  
  44.  Note that the english alphabet has 26 characters, so the possible
  45. permutations are 26! (26*25*24*23*22*....*2*1), which is a quite big
  46. number :)
  47.  
  48. Transposition cipher
  49. --------------------
  50.  Also the transposition cipher is based on a permutation, but in this
  51. cipher there we must select a period P, which is also knows as the period
  52. of the transposition. The plain text is then divided in pieces which
  53. lenght is equal to P and each character of this pieces is changed with
  54. the appropriate permutation that we have created before. So, if the
  55. selected P was 5 let's select a permutation of integers from 1 to P:
  56.  
  57.     1 2 3 4 5
  58.     3 1 5 4 2
  59.  
  60.  Now let's say that our phrase to encrypt (spaces are ignored) is:
  61.  
  62.      YO COME ON AND HACK
  63.  
  64.  And now let's divide the phrase in pieces of five (again, spaces are
  65. ignored :) ). To divide the parts we will use a "/":
  66.  
  67.     YO COM/E ON AN/D HACK
  68.  
  69.  and now let's mix the letters as we decided before. The result is
  70.  
  71.     CY MOON EN AOA DKCH
  72.  
  73.  Also here to decrypt the we must just use the inverse permutation on the
  74. P-long parts:
  75.  
  76.     3 1 5 4 2
  77.     1 2 3 4 5
  78.  
  79. Additive cipher
  80. ---------------
  81.  To work with this type of cipher we must imagine that the alphabet is
  82. such an interrupted chain, when after the last Z there is again the first
  83. A and so on. The additive cipher is very simple and is based on a rotation
  84. of the alphabet. Let's see an example
  85.  
  86.     A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  87.  
  88.  After a rotation of 4 to right it becomes
  89.  
  90.     W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
  91.  
  92.  Now to encrypt the message we must just change each character with the
  93. correspondant rotated one. So HELLO THERE will became DAHHK PDANA. As you
  94. can see the rotations that we can made are from 0 (plain text) to 25, not
  95. a lot of possibilityes really. An example of the additive cipher is the
  96. Caezar cipher, which was basically an additive cipher with the fixed
  97. rotation of 3 to the left. To decrypt a message encrypted with the
  98. additive cipher we must just know the number of the executed rotations.
  99.  
  100. Vigenere cipher
  101. ---------------
  102.  The Vigenere cipher is based on a secret word, let's say VIRUS. Let's
  103. suppouse that we are going to crypt this phrase:
  104.  
  105.    MICROSUCK REALLY SUCK
  106.   (VIRUSVIRU SVIRUS VIRU)
  107.  
  108.  The second line, where the secret word is repeated, is used for the
  109. encryption. Using the Vigenere table (look at the Appendix) we will
  110. encrypt each letter using the right row correspondant to the current
  111. character of our secret word. So the first M will be encrypted using the
  112. row V, so the M will became a H, the I using the row I will became a Q,
  113. the C a T and so on. The encrypted message will be (space are ignored):
  114.  
  115.    HQTLGNCTE JZICFQ NCTE
  116.  
  117.  To decrypt the message we can just look into the Vigenere table in the
  118. column corresponding the key character and find the character for which
  119. the result is our encrypted letter.
  120.  
  121. Grate cipher
  122. ------------
  123.  This is a very simple method of encryption. The plain text is written in
  124. two lines, going up and down. So the phrase REALLY COOL PHILES (ignoring 
  125. spaces) is encrypted writing a character in the first row, then one in
  126. the second, then again one in the first, again one in the second and so
  127. on. Like this:
  128.  
  129.   R   A   L   C   O   P   I   E
  130.     E   L   Y   O   L   H   L   S
  131.   
  132.  And the resulting encrypted phrase is RALCOPIEELYOLHLS.
  133.  
  134. Column transposition cipher
  135. ---------------------------
  136.  The plain text is written in part of a deteminated lenght, any part in
  137. a new row, as explained below. 
  138.  (The phrase is WELCOME TO THE IKX and the selected period is 3)
  139.  
  140.         W E L
  141.         C O M
  142.         E T O
  143.         T H E
  144.         I K X
  145.  
  146.  And now we must select a permutation between 1 and the selected number
  147. (in our example 3). Let's say 3 2 1. In the final encrypted output the
  148. colums are written horizontally in the specified order of the permutation.
  149. So the third column will be written first, then the second and then the
  150. first. The result that follows is LMOEX EOTHK WCETI.
  151.  
  152. Adding key cipher
  153. -----------------
  154.  In this example we will need a secret key of lenght n. Let's define that
  155. the first character of the key is named k(0), the second k(1) and the last
  156. k(n-1). The same will be for the phrase that we want to encrypt. The first
  157. character will be called p(0), the second p(1) and so on. The encryption
  158. method is simple:
  159.  
  160.   r(i) = [ p(i) + k(i mod n) ] mod 26
  161.  
  162.  r(i) is the resulting i letter. Of course in this method we assign to
  163. each letter a number starting with 0. So A will have the value of 0, B of
  164. 1 and up to Z of 25. And now let's see an example:
  165.  
  166.  SPACES ARE OF COURSE IGNORED             
  167.  KINDAK IND AK INDAKI NDAKIND
  168.  
  169. the first phrase is in plain text, and in the second phrase we put the
  170. secret word (KINDA) so all the decrypted text will be covered. Now let's
  171. see how this works. Let's calculate the first letter:
  172.  
  173.  r(0) = [ p(0) + k(0 mod 5) ] mod 26
  174.  r(0) = [ p(0) + k(0) ] mod 26
  175.  r(0) = [ "S" + "K" ] mod 26
  176.  r(0) = [ 18  + 10 ] mod 26
  177.  r(0) = 28 mod 26
  178.  r(0) = 2
  179.  r(0) = "C"
  180.  
  181.  and so on. the second letter will be a X (15 + 8), then a N (0 + 13) and
  182. so on. The resulting message is
  183.  
  184.  CXNFEC IFH OP KBXRCM VJNYZRG
  185.  
  186.  
  187.  
  188. Appendix
  189. --------
  190.  
  191. Vigenere table
  192. --------------
  193.  
  194.     A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  195.     B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
  196.     C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
  197.     D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
  198.     E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
  199.     F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
  200.     G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
  201.     H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
  202.     I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
  203.     J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
  204.     K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
  205.     L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
  206.     M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
  207.     O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
  208.     P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
  209.     Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
  210.     R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
  211.     S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
  212.     T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
  213.     U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
  214.     V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
  215.     W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
  216.     X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
  217.     Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
  218.     Z A B C D E F G H I J K L M N O P Q R S T U V W X Y 
  219.  
  220. C program to encrypt with the Vigenere cipher
  221. ---------------------------------------------
  222.  
  223. /*
  224.  
  225.  Compile it with GCC:
  226.     gcc vig.c -o vigenere 
  227.  Execute it:
  228.         vigenere < input_file
  229.  Where the first line in the input_file must contain the key (which
  230. length is minor of MAXKEYLENGTH) and the other lines may contain the plain
  231. text that you would like to encrypt. Note that this sample program only
  232. handles lowercase inputs.    
  233.  
  234. */
  235.  
  236. #include <stdio.h>
  237.  
  238. #define MAXKEYLENGTH 20     /* maximum length of the key */
  239. char key[MAXKEYLENGTH+1];   /* encipherment key */
  240. int  keylength = 0;         /* length of the used key */
  241.  
  242. FILE *fp;                   /* set to stdin if interactive, else file */
  243.  
  244. void getkeyfromfile(void)
  245. {
  246.   char *tmp = key;          /* pointer to key array */
  247.   for (keylength=0; keylength < MAXKEYLENGTH; keylength++)
  248.     if ((key[keylength]= getc(fp)) == '\n') break;
  249. }
  250.  
  251. int encipher(int i)         /* key position */
  252. {
  253.   int tmp;                  /* for cipher char calculation */
  254.   char currentchar;         /* current charachter */
  255.  
  256.   currentchar = getc(fp);
  257.   if (currentchar >= 'a' && currentchar <= 'z') 
  258.    {  
  259.       tmp = (currentchar + key[i] - 2*'a') % 26;
  260.       while (tmp < 0) tmp += 26;
  261.       tmp += 'a';
  262.    } 
  263.   else 
  264.       tmp = currentchar;   /* if not alphabetic return unchanged */
  265.   return(tmp);
  266. }
  267.  
  268. void vigenere(void)
  269. {
  270.   int current, i=0;              /* cipher character */
  271.   
  272.   while (!feof(fp)) 
  273.    {             
  274.     current = encipher(i);      /* generate encrypted character */
  275.     if (current < 'a' || current > 'z')
  276.       {
  277.        putchar(' ');    /* do a space */     
  278.        continue;        /* if not an alphabetic lowercase */  
  279.       }
  280.  
  281.     if (i == keylength-1)    /* end of the key? */
  282.        i=0;
  283.     else      
  284.        i++;
  285.     putchar(current);
  286.   }
  287.   putchar('\n');
  288. }
  289.  
  290. void main(void)
  291. {
  292.   fp = stdin;
  293.   getkeyfromfile();
  294.   vigenere();
  295. }
  296.  
  297.